package agenda;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import java.util.Set;
import java.util.TreeMap;

import javax.swing.Icon;
/**
 * Classe Contato
 * 
 * @author Célio Roberto, Ricarod Magno, Wesley Brenno
 * 
 */
public class Contato implements Serializable {
	private String nome, endereco, dataDeAniversario, descricao;
	private HashMap<String, String> formasdecontato;
	
	private Icon Foto;
	/**
	 * Retorna o Nome do Contato
	 * 
	 * @return Nome do Contato
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * Retorna a Descrição do Contato
	 * 
	 * @return Descrição do Contato
	 */
	public String getDescricao() {
		return descricao;
	}
	/**
	 * Altera a descrição do Contato
	 * 
	 * @param descricao
	 *            Nova descrição do Contato
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	/**
	 * Altera o Nome do contato
	 * 
	 * @param nome
	 *            Novo nome do contato
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * Retorna o Endereço do Contato
	 * 
	 * @return Endereço do Contato
	 */
	public String getEndereco() {
		return endereco;
	}

	/**
	 * Altera o Endereço do Contato
	 * 
	 * @param endereco
	 *            Novo endereço do Contato
	 */
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	
	/**
	 * Pega a foto do Contato
	 * @return
	 * 		A foto do Contato
	 */
	public Icon getFoto(){
		return this.Foto;
	}
	
	/**
	 * Altera a foto do Contato
	 * @param Foto
	 * 		Nova foto do Contato
	 */
	public void setFoto(Icon Foto){
		this.Foto = Foto;
	}
	/**
	 * Retorna a Data de Aniversario do Contato
	 * 
	 * @return Data de Aniversario do Contato
	 */
	public String getDataDeAniversario() {
		return dataDeAniversario;
	}

	/**
	 * Altera a Data de Aniversario do contato
	 * 
	 * @param dataDeAniversario
	 *            Nova data de aniversario do Contato
	 */
	public void setDataDeAniversario(String dataDeAniversario) {
		this.dataDeAniversario = dataDeAniversario;
	}
	/**
	 * Retorna o ArrayList com as Formas de Contato
	 * 
	 * @return Retorna O ArrayList com as Formas de Contato
	 */
	public HashMap getFormasDeContato() {
		return this.formasdecontato;
	}
	/**
	 * Cadastra uma forma de Contato
	 * @param FormaDeContato
	 * 		Forma de Contato a ser cadastrada
	 * @param Endereco
	 * 		Endereço da Forma de Contato
	 */
	public void CadastraFormaDeContato(String FormaDeContato, String Endereco) {
		this.formasdecontato.put(FormaDeContato, Endereco);
	}

	
	/**
	 * Construtor da Classe Contato
	 * 
	 * @param nome
	 *            Nome do Contato
	 * @param endereco
	 *            Endereço do Contato
	 * @param dataDeAniversario
	 *            Data de Aniversario do Contato
	 * @param formasDeContato
	 *            Formas de contato do Contato
	 * @param descricao
	 *            Descrição do Contato
	 * @throws Exception
	 *             Se não for cadastrada pelo menos um forma de contato
	 * 
	 */
	public Contato(String nome, String endereco, String dataDeAniversario,
			String FormaDeContato,String EnderecoDeContato, String descricao, Icon Foto) {
		this.nome = nome;
		this.endereco = endereco;
		this.dataDeAniversario = dataDeAniversario;
		this.descricao = descricao;
		this.formasdecontato = new HashMap<String,String>();
		formasdecontato.put(FormaDeContato, EnderecoDeContato);
		this.Foto = Foto;
	}
	/**
	 * Remove uma Forma De Contato
	 * @param FormaDeContato
	 * 		A forma de Contato a ser removida
	 */
	public void removeFormaDeContato(String FormaDeContato){
		if(formasdecontato.size()>= 2){formasdecontato.remove(FormaDeContato);}
		else{System.out.println("Não pode apagar todas as formas de contato, tem que haver pelo menos uma");}
	}
	/**
	 * Representação em String do Contato
	 */
	public String toString() {
		return "Contato:\nNome: " + getNome() + "\nEndereço: " + getEndereco()
				+ "\nDescricao: " + getDescricao() + "\nData de nascimento: "
				+ getDataDeAniversario() + "\n"+getFormasDeContato();
	}
}
/*
 * Caso 3: Cadastrar contatos O usu�rio pode criar uma lista de contatos para
 * si. Esses contatos ser�o, em casos de uso posteriores, adicionados a eventos.
 * Cada contato � identificado pelo nome, endere�o, data de anivers�rio e suas
 * formas de contato (telefone, email, skype, etc). Cada forma de contato
 * consiste de um nome (Skype, Email, Telefone, �), um endere�o (no caso do
 * telefone, o n�mero, do email, o email, etc.) e um coment�rio opcional. Deve
 * existir pelo menos uma forma de contato para cada contato cadastrado, e �
 * poss�vel cadastrar v�rias formas de contato para um contato, inclusive do
 * mesmo tipo
 */